const express = require('express');
const http = require('http');
const socketIo = require('socket.io');
const cors = require('cors');

// 创建 Express 应用实例
const app = express();

// 创建 HTTP 服务器
const server = http.createServer(app);

// 创建 socket.io 服务器
const io = socketIo(server, {
  cors: {
    origin: "*",
    methods: ["GET", "POST", "PUT", "DELETE"],
    allowedHeaders: ["Content-Type", "Authorization"],
    credentials: true,
  }
});

// 设置一个boolen值，默认为false
var num = false; 
var data = {};

// 设置定时器，每 5 秒在控制台输出一次数据
setInterval(() => {
  num = Math.random() > 0.5;
  // 更新数据对象
  updateData();
  // 在控制台输出数据
  console.log('实验箱广播数据', data);
}, 2000);

var satrt_time;

// 更新数据对象
function updateData() {
  data = {
    // 这个是照明灯的状态 0 关闭 1 开启
    // 这个是风速
    "gz": num ? (400 + Math.random() * 200).toFixed(0).toString() : (400 - Math.random() * 200).toFixed(0).toString(),
    // 这个是温度
    "temp": num ? (27 + Math.random() * 3 ).toFixed(2).toString() : (27 - Math.random() / 10).toFixed(2).toString(),
    // 这个是湿度
    "hum": num ? (64 + Math.random() / 10).toFixed(2).toString() : (64 - Math.random() / 10).toFixed(2).toString(),
    // 这个是温湿度的状态 0 关闭 1 开启
    "temp_status": 1,
    "hum_status":1,
    // 这个是光照强度的状态 0 关闭 1 开启
    "gz_status": 1,
  };
}

// 开启定时器
const start = () => {
  satrt_time = setInterval(() => {
    // 向客户端发送数据
    io.emit('data', JSON.stringify(data));
  }, 2000);
}

// 停止定时器
const stop = () => {
  clearInterval(satrt_time);
}

// 当客户端连接时触发
io.on('connection', (socket) => {
  console.log('客户端已连接');
  // 启动定时器
  start();

  // // 当客户端发送消息时触发
  socket.on('fs_status', (message) => {
    data.fs_status = +message > 0 ? '1' : '0'; // 根据客户端消息更新fs_status
    stop(); // 停止定时器
    start(); // 启动定时器

    console.log('客户端发送消息：', message);
  });
  // 当客户端断开连接时触发
  socket.on('disconnect', () => {
    console.log('客户端已断开连接');
  });
});

// 启动服务器
const PORT = 8888
server.listen(PORT, () => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
});